package com.sinry.common.log.utils;

import org.slf4j.MDC;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * @author linxinlei
 * @project sinry-cloud
 * @description TraceId工具类
 * @date 2022/5/31
 **/
public class TraceIdUtil {

    /**
     * 当前应用id
     */
    public static final String SPAN_ID = "spanId";
    /**
     * 调用方id
     */
    public static final String PARENT_ID = "parentId";
    /**
     * 全链路id
     */
    public static final String TRACE_ID = "traceId";
    /**
     * 当traceId为空时，显示的traceId。随意。
     */
    public static final String DEFAULT_TRACE_ID = "0";

    /**
     * 设置traceId
     */
    public static void setTraceId(String traceId) {
        //如果参数为空，则设置默认traceId
        traceId = StringUtils.hasText(traceId) ? traceId : DEFAULT_TRACE_ID;
        //将traceId放到MDC中
        MDC.put(TRACE_ID, traceId);
    }

    /**
     * 获取traceId
     */
    public static String getTraceId() {
        //获取
        String traceId = MDC.get(TRACE_ID);
        //如果traceId为空，则返回默认值
        return StringUtils.hasText(traceId) ? traceId : DEFAULT_TRACE_ID;
    }

    /**
     * 设置parentId
     */
    public static void setParentId(String parentId) {
        //如果参数为空，则设置默认parentId
        parentId = StringUtils.hasText(parentId) ? parentId : DEFAULT_TRACE_ID;
        //将traceId放到MDC中
        MDC.put(PARENT_ID, parentId);
    }

    /**
     * 获取parentId
     */
    public static String getParentId() {
        //获取parentId
        String parentId = MDC.get(PARENT_ID);
        //如果parentId为空，则返回默认值
        return StringUtils.hasText(parentId) ? parentId : DEFAULT_TRACE_ID;
    }

    /**
     * 获取spanId
     */
    public static String getSpanId() {
        //获取spanId
        String spanId = MDC.get(SPAN_ID);
        //如果spanId为空，则生成新的spanId
        return StringUtils.hasText(spanId) ? spanId : genSpanId();
    }

    /**
     * 设置spanId
     */
    public static void setSpanId(String spanId) {
        //如果参数为空，则设置默认spanId
        spanId = StringUtils.hasText(spanId) ? spanId : DEFAULT_TRACE_ID;
        //将spanId放到MDC中
        MDC.put(SPAN_ID, spanId);
    }

    /**
     * 判断traceId为默认值
     */
    public static Boolean defaultTraceId(String traceId) {
        return DEFAULT_TRACE_ID.equals(traceId);
    }

    /**
     * 生成traceId
     */
    public static String genTraceId() {
        return UUID.randomUUID().toString();
    }

    /**
     * 生成spanId
     */
    public static String genSpanId() {
        return UUID.randomUUID().toString();
    }

}
